昨天,我在深圳开展了一场 Agentic Coding 训练营。

刚好遇上台风,深圳受到的影响比较直接。让我很感动的是,学员们还是从不同城市赶了过来,其中还有一位从北京来的学员。她周五晚上从北京飞过来,因为担心回不去临时周六晚上乘坐高铁回了北京。

这次训练营里,有一位来自清华建筑系的学员,也是我的好朋友,花姐。

课堂上,她问了我一个很有意思的问题:

有没有可能,一个人先把产品的所有功能都完整地规划好,再一次性交给 AI,让 AI 把整个产品开发出来?

这个问题看起来是在讨论 AI 的能力,但后来我发现,它真正触及的,可能是一个更深的问题:

一个人究竟能不能在产品出现之前,就把产品完整地想清楚?

一次想清楚,再开始开发

在课堂里,我一直强调一件事:

不要等到所有问题都想清楚以后,才开始动手。

这并不是说规划不重要,也不是说写 PRD、画流程图、梳理功能没有意义。相反,AI 编程尤其需要我们把想法表达得更清楚。

但我不太赞成一种完美主义式的开发方式:

先把所有功能、界面、流程、异常情况和用户需求全部想清楚,再把这一整套方案交给 AI,期待它一次性把产品做完。

花姐继续问我:

如果未来 AI 足够强呢? 假设有一个人非常厉害,他真的能够把所有功能都想清楚,那他是不是就可以一次性交给 AI,让 AI 全部做完?

我当时没有直接回答“可以”或者“不可以”,而是和她一起换了一个角度。

我问她:

假设我们要完整复刻淘宝。 我把淘宝所有页面都截下来,给 AI 一千张截图,它能不能根据这些截图,重新做出一个完整的淘宝?

表面上看,一千张截图已经包含了大量信息。

商品页面长什么样、购物车在哪里、订单页面如何排列、按钮是什么颜色、不同状态如何展示,这些内容似乎都已经被记录下来了。

但我们都知道,仅仅依靠这些截图,很难真正做出一个可以运行的淘宝。

为什么?

因为一个产品真正复杂的部分,往往并不在画面里。

产品里有大量“看不见的东西”

当我们使用一个成熟产品时,能够看到的是页面、按钮、文字、图片和交互反馈。

但在这些表面之下,还存在着大量看不见的业务逻辑:

用户没有登录时会发生什么?

商品突然下架怎么办?

库存只剩一件,但有两个人同时付款怎么办?

订单已经支付,但商家没有发货怎么办?

退款、换货、优惠券、地址修改、物流异常分别如何处理?

不同身份的用户能够看到什么,又拥有什么权限?

数据如何存储?状态如何变化?不同功能之间如何互相影响?

这些内容很难通过截图完整地表达出来。

即使我们写了一份非常详细的 PRD,也很难在开发开始之前,穷尽所有可能出现的情况。

这不是因为产品经理不够聪明,也不是因为开发者能力不足,而是因为产品并不是一张静止的图。

它更像是一个运行中的系统。

只有当用户开始点击、输入、等待、返回、犯错,甚至做出一些我们没有预料到的操作时,这个系统真正的样子才会逐渐显现出来。

当这些看不见的部分没有被说清楚时,AI 只能根据它过去见过的产品和代码,去猜测这个功能“通常应该怎么工作”。

有时它猜得很好,有时它猜得不符合我们的真实需要。

所以,AI 生成出来的第一个版本,通常并不是最终答案。

它更像是一个提问:

你想要的是这样吗?

而我们需要通过这个初步结果,继续认识自己的需求。

给自己做产品,可能是最难的

后来我又想到,给自己做产品,可能比给别人做产品更加复杂。

因为很多时候,我们并没有自己想象得那么了解自己。

我们以为自己知道想要什么,但当产品真的出现在面前时,才会发现:

这个功能好像没有想象中重要。

原来我真正需要的不是这个按钮,而是减少一个操作步骤。

这个页面单独看没有问题,但放到完整流程中却显得多余。

我原本以为用户会这样使用,实际体验之后却发现,自己都不会这样使用。

更重要的是,人在思考的过程中,本身也会发生变化。

当我们看到一个更好的方案时,会改变原来的判断。

当我们把问题思考得更深入时,会重新理解最初的需求。

当产品从脑海里的想象变成可以点击的界面时,我们又会获得新的感受。

有时候,这些新的认识会修改一个功能;有时候,它们会推翻前面的整个结构。

所以,产品开发并不是把一个早已完整存在于脑海里的答案,逐字翻译成代码。

更多时候,我们是在开发过程中,逐渐发现答案。

产品不是先有鸡,还是先有蛋

回过头再想花姐的问题,我觉得它有点像“先有鸡还是先有蛋”。

如果一个人必须先把产品完全想清楚,才能开始开发,那么问题是:

在没有看到产品运行之前,我们怎么知道自己已经想清楚了?

但如果我们必须先把产品做出来,才能知道它应该是什么样子,那么又该从哪里开始?

其实,大多数产品都不是从一个完整答案开始的。

它们往往从一个模糊的念头、一个具体的问题,或者一个并不完善的原型开始。

我们先做出一点东西。

这个东西反过来刺激我们思考。

我们看到问题,修改它;看到新的可能,再继续往前走。

想法产生原型,原型改变想法;新的想法又产生新的原型。

鸡和蛋不是两个必须分出先后的答案,而是一个不断循环的过程。

同样,产品也不是“想清楚”和“做出来”两个相互分离的阶段。

思考本身就是开发的一部分,开发也会成为思考的工具。

如果未来真的出现 AGI 呢?

花姐后来又问:

如果未来真的有了 AGI,这个问题会不会被解决?

我觉得,首先要问的是:

所谓 AI“理解一个人”,究竟意味着什么?

它可以记住我们的对话,可以分析我们的偏好,也可以根据大量上下文,推测我们可能需要什么。

未来的 AI 也许会越来越了解我们的工作方式、表达习惯和判断标准。

但它真的能够完整地知道,我们脑海里正在想什么吗?

它能够知道那些连我们自己都还没有意识到的需求吗?

它能够提前知道,当我们看到某个结果之后,自己的想法会如何改变吗?

我对此并不确定。

因为问题可能不只是 AI 能不能理解人。

更根本的问题是:

人自己是否已经理解了自己?

如果一个需求在我们心里都还没有形成,那么 AI 很难直接把它读取出来。

如果我们的判断会随着体验而变化,那么即使 AI 完整执行了我们昨天的想法,今天的我们也可能已经不再认同那个结果。

因此,即使未来 AI 的能力大幅提升,产品创造可能依然不会变成一个完全单向的过程:

人提出完整要求,AI负责执行,产品一次成型。

它可能仍然是一种持续的对话。

只不过 AI 能更快地把想法变成原型,更主动地发现矛盾,也更早地提示那些我们没有看到的问题。

从一个故事,到一个真实产品

在训练营里,我还观察到了花姐学习 AI 编程时的另一个现象。

她很喜欢和 ChatGPT 对话。

当她谈论一个产品时,她会描述很多情景、人物和故事。ChatGPT 也能够沿着这些故事继续展开,把一个想法描述得非常完整、非常生动。

这其实是一种很重要的能力。

好的产品,往往就是从对人的观察和对情境的理解开始的。

建筑专业的训练,也让她更习惯从空间、关系、体验和生活场景出发,而不只是从一个功能列表出发。

但问题也恰恰出现在这里。

当一个故事已经被讲得很生动以后,下一步应该怎么做?

故事里的哪些部分需要成为功能?

哪些只是帮助我们理解用户的背景?

一个模糊的愿望,如何变成可以验证的需求?

一个生活情景,如何变成页面、数据、状态和交互?

当用户做出不同选择时,系统分别应该如何回应?

这里存在着一个很大的 Gap。

在 ChatGPT 中谈论产品,与真正做出产品,并不是同一件事。

前者更接近叙事、想象和意义建构,后者则需要把这些内容转化为结构、规则和可以运行的系统。

例如,一个人可能会说:

我想做一个能够理解我的 AI 助手。 它应该在我忙乱的时候帮助我整理任务,在我犹豫的时候给我建议,在我拖延的时候提醒我。

这是一个很好的产品愿景,也包含了非常具体的生活画面。

但要把它做成产品,还需要继续追问:

AI 通过什么判断用户正在忙乱?

哪些任务由 AI 自动整理,哪些必须经过用户确认?

“给建议”是提供一个答案,还是展示多个选择?

提醒到什么程度不会让人觉得被打扰?

AI 判断错误时,用户怎样纠正它?

这些纠正会不会影响下一次判断?

什么数据可以被记录,什么数据不能被读取?

从故事到产品,需要经过这样一层又一层的转译。

把脑海里的画面“纸面化”

训练营结束后,我一直在想:

无论对于 AI 编程的初学者,还是对于教授 AI 编程的老师,这可能都是一个非常值得研究的问题。

我们应该怎样帮助一个人,把脑海里的画面逐渐表达出来?

这里的“纸面化”,并不只是让他写一份长长的 PRD。

有些人擅长写功能,有些人擅长讲故事,有些人通过画图思考,有些人必须看到一个原型,才知道自己真正的感受。

我们也许需要一套中间语言,帮助不同的人完成几个阶段的转换:

从感受转化为情景;

从情景转化为问题;

从问题转化为需求;

从需求转化为行为;

从行为转化为流程;

从流程转化为功能;

从功能转化为数据、状态和规则;

最后,再把这些内容转化为可以运行和验证的产品。

AI 在这个过程中,不应该只是最后那个负责写代码的工人。

它也可以成为一个帮助我们澄清想法的合作者。

它可以追问:

这个场景里真正困难的是什么?

谁在什么情况下会使用这个功能?

用户完成这件事之前和之后,分别处于什么状态?

如果系统判断错误,会带来什么后果?

现在这个需求,是必须实现的,还是只是一个想象中的加分项?

这些问题不一定马上带来答案,但能够帮助我们看见自己还没有想清楚的部分。

AI 编程不是把思考外包出去

这次和花姐的对话,并没有让我觉得她的问题是错误的。

恰恰相反,我觉得这是一个非常好的问题。

因为很多人学习 AI 编程时,都会自然地产生一种期待:

既然 AI 写代码这么快,我是不是只要把要求表达得足够清楚,它就能够一次性把产品做完?

这种期待很容易理解。

我们过去常常认为,产品设计负责想清楚,开发负责做出来。现在开发的一部分被 AI 接管以后,我们自然会想,是否只需要把前面的“想清楚”做到极致,就可以彻底消除后面的反复。

但也许,反复并不是一种低效率。

有些反复,是因为需求不清;有些反复,是因为执行出错。但还有一些反复,是创造本身必不可少的过程。

我们通过做出来的东西,重新认识问题。

通过失败的方案,理解真正的限制。

通过一个并不完美的版本,发现过去看不见的可能。

所以,AI 编程并不意味着把思考外包给 AI。

它更像是让思考变得可以被快速看见。

以前,一个想法可能要等待几周,才能变成一个原型。现在,我们也许一天甚至几个小时,就能看到它最初的形态。

速度变快以后,我们不应该要求自己第一次就做对。

相反,我们可以更早地允许想法接受现实的检验。

不要等到想清楚一切

这次深圳训练营留给我的感受是:

我们当然应该认真规划,也应该努力把需求表达清楚。

但不必等到想清楚一切,才允许自己开始。

因为有些问题,只有开始以后才会出现。

有些需求,只有看到产品以后才会被意识到。

有些判断,只有在真实使用中才能形成。

我们不是先知,AI也不是。

AI无法替我们提前经历一个尚未出现的产品,也无法替我们确定未来的自己会喜欢什么。

但它可以陪我们更快地走进那个未知的过程。

我们提出一个还不成熟的想法,AI帮助它获得初步的形状;我们看到这个形状,再修改自己的理解;新的理解又推动产品继续变化。

在这个过程中,产品被一点点做出来,我们也在一点点认识自己。

所以,比起追求“一次性把产品全部想清楚”,我现在更关心另一个问题:

我们能不能建立一种更好的方法,让一个人脑海里的感受、故事和画面,逐渐变成可以讨论、可以验证、可以修改,最终可以运行的产品?

这可能是 AI 编程接下来真正重要的课题。

它不只是关于怎样让 AI 写出更多代码。

它也关于,我们怎样借助 AI,把那些还说不清楚的念头,慢慢变成现实。


最后,感谢花姐给了这么高的评价!

如果想了解下一期Agentic Coding训练营,欢迎 +v:xuezhirong233